//package com.example.behaviour.handler;
//
//import com.alibaba.fastjson.JSON;
//import com.alibaba.fastjson.JSONObject;
//import com.example.behaviour.config.SpringUtils;
//import com.example.behaviour.message.AckResponseMessage;
//import com.example.behaviour.message.ChatRequestMessage;
//import com.example.behaviour.message.ChatResponseMessage;
//import com.example.behaviour.message.LatestMsgListResponseMessage;
//import com.example.behaviour.pojos.Message;
//import com.example.behaviour.session.SessionFactory;
//import com.example.common.constants.MessageConstants;
//import com.example.common.redis.RedisCache;
//import io.netty.channel.Channel;
//import io.netty.channel.ChannelFutureListener;
//import io.netty.channel.ChannelHandlerContext;
//import io.netty.channel.SimpleChannelInboundHandler;
//import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.beans.BeanUtils;
//
//import java.util.*;
//import java.util.stream.Collectors;
//
////@ChannelHandler.Sharable
//@Slf4j
//public class ChatRequestMessageHandler2 extends SimpleChannelInboundHandler<TextWebSocketFrame> {
//
//
//    private static RedisCache redisCache;
//
//    @Override
//    protected void channelRead0(ChannelHandlerContext ctx, TextWebSocketFrame msg) {
//
//        redisCache = SpringUtils.getBean(RedisCache.class);
//
//        JSONObject jsonObject = JSONObject.parseObject(msg.text());
//
//        ChatRequestMessage chatRequestMessage = JSONObject.toJavaObject(jsonObject,ChatRequestMessage.class);
//        System.out.println("chatRequestMessage "+chatRequestMessage);
////        TextWebSocketFrame frame = new TextWebSocketFrame(JSONObject.toJSONString(chatRequestMessage));
////        ctx.writeAndFlush(frame);
//
//        if(!chatRequestMessage.isLogin()){
//            Message message = JSONObject.toJavaObject(jsonObject,Message.class);
//            message.setCreatedTime(new Date());
//            message.setId(UUID.randomUUID().toString());
//
//            AckResponseMessage ackResponseMessage1 = JSONObject.toJavaObject(jsonObject,AckResponseMessage.class);
//            ackResponseMessage1.setMessageType(MessageConstants.SENT);
//            ackResponseMessage1.setTypeInfo("消息已发送");
//            TextWebSocketFrame frame = new TextWebSocketFrame(JSON.toJSONString(ackResponseMessage1));
//            ctx.writeAndFlush(frame);
//            updateRedisData(redisCache,message,MessageConstants.SENT,"消息已发送");
//
//            String to = chatRequestMessage.getTo();
//            ChannelHandlerContext channel = SessionFactory.getSession().getChannel(to);
//            // 在线 发送消息
//            if (channel != null) {
////                ChatResponseMessage chatResponseMessage = new ChatResponseMessage(chatRequestMessage.getUsername(), chatRequestMessage.getContent());
//
//
//                //聊天信息缓存到redis
//
//
//                TextWebSocketFrame res_frame = new TextWebSocketFrame(JSONObject.toJSONString(message));
//                channel.writeAndFlush(res_frame);
//
//
//
//                System.out.println("消息 "+message.toString());
//
//                String listJson = redisCache.get(MessageConstants.FROM + message.getUsername() + MessageConstants.TO + message.getTo());
//                List<Message> messageList = new ArrayList<>();
//                if(listJson == null || "[]".equals(listJson)){
//                    messageList.add(message);
//                }else{
//                    messageList = JSON.parseArray(listJson,Message.class);
//                    messageList.add(message);
//                }
//                try {
//                    redisCache.set(MessageConstants.FROM + message.getUsername() + MessageConstants.TO + message.getTo(),JSON.toJSONString(messageList));
//                    log.info("数据缓存成功");
//                    //告诉发送方消息已发送
//                    AckResponseMessage ackResponseMessage = new AckResponseMessage();
//                    BeanUtils.copyProperties(message,ackResponseMessage);
//                    ackResponseMessage.setAckMsgId(message.getId());
//                    ackResponseMessage.setMessageType(MessageConstants.DELIVERED);
//                    ackResponseMessage.setTypeInfo("消息已送达");
//                    TextWebSocketFrame webSocketFrame = new TextWebSocketFrame(JSON.toJSONString(ackResponseMessage));
//                    ctx.writeAndFlush(webSocketFrame);
//                    updateRedisData(redisCache,message,MessageConstants.DELIVERED,"消息已送达");
//                }catch (Exception e){
//                    e.printStackTrace();
//                }
//                //返回最新的消息列表
//                TextWebSocketFrame frame1 = getLatestData(redisCache, message);
//                channel.writeAndFlush(frame1);
//                ctx.writeAndFlush(frame1);
////                ctx.fireChannelRead(msg.retain());
////                ctx.fireChannelRead(frame1.retain());
//
//            }
//            // 不在线
//            else {
//                ChatResponseMessage chatResponseMessage = new ChatResponseMessage(false, "对方用户不存在或者不在线");
//                TextWebSocketFrame res_frame = new TextWebSocketFrame(JSONObject.toJSONString(chatResponseMessage));
//                ctx.writeAndFlush(res_frame);
//            }
//        }
////        ctx.fireChannelRead(msg);
//    }
//
//    public TextWebSocketFrame getLatestData(RedisCache redisCache,Message message){
//        String new_listJson = redisCache.get(MessageConstants.FROM + message.getUsername() + MessageConstants.TO + message.getTo());
//        LatestMsgListResponseMessage latestMsgListResponseMessage = new LatestMsgListResponseMessage();
//        latestMsgListResponseMessage.setMessageListStr(new_listJson);
//        TextWebSocketFrame frame1 = new TextWebSocketFrame(JSON.toJSONString(latestMsgListResponseMessage));
//
//        return frame1;
//    }
//
//    public void updateRedisData(RedisCache redisCache,Message message,Integer msgType,String typeInfo) {
//        log.info("hhh1");
//        log.info("message {}",message.toString());
//        String listJson = redisCache.get(MessageConstants.FROM + message.getUsername() + MessageConstants.TO + message.getTo());
//        List<Message> messageList;
//        log.info("hhh2");
//        if (listJson == null || "[]".equals(listJson) || listJson.length() == 0) {
//            return;
//        } else {
//            messageList = JSON.parseArray(listJson, Message.class);
//            messageList = messageList.stream().map(item -> {
//                if (Objects.equals(item.getId(), message.getId())) {
//                    item.setMsgType(msgType);
//                    item.setTypeInfo(typeInfo);
//                }
//                return item;
//            }).collect(Collectors.toList());
//        }
//        redisCache.set(MessageConstants.FROM + message.getUsername() + MessageConstants.TO + message.getTo(),JSON.toJSONString(messageList));
//        log.info("hhh3");
//
//    }
//}
